Ruby 日記 5日目: includeの引数に複数のモジュールを指定した場合、 最後の引数から順にincludeする
#Ruby_日記 #2021-08-30
https://rex.libertyfish.co.jp/exam_histories/42141/user_answers/541eb192-7f38-4045-a6d3-d40b449ebd83
次のコードを実行するとどうなりますか
code:gold/ex05/main.rb
module M1
end
module M2
end
class C
include M1, M2
end
p C.ancestors
選択肢:
[C, M1, M2, Object, Kernel, BasicObject]が表示される
[C, M2, M1, Object, Kernel, BasicObject]が表示される
[M1, M2, C, Object, Kernel, BasicObject]が表示される
[M2, M1, C, Object, Kernel, BasicObject]が表示される
解説:
instance method Module#include (Ruby 2.1.0)
モジュールの機能追加は、クラスの継承関係の間にそのモジュールが挿入 されることで実現されています。従って、メソッドの探索などは スーパークラスよりもインクルードされたモジュールのほうが 先に行われます
CクラスはObjectクラスを継承しているので、M1やM2はCクラスとObjectクラスの間に入るってことになる
引数に複数のモジュールを指定した場合、 最後の引数から順にインクルードします。
つまり
code:c.rb
class C
include M1, M2
end
は
code:c.rb
class C
include M2
include M1
end
と同じ
すなわち、次のような流れになる
CクラスとObjectクラスの間にM2が入る
CクラスとM1の間にM2が入る
したがって正解は
code:sh
# ruby gold/ex05/main.rb
C, M1, M2, Object, Kernel, BasicObject
/icons/hr.icon
Module#ancestors (Ruby 3.0.0 リファレンスマニュアル)
クラス、モジュールのスーパークラスとインクルードしているモジュールを優先順位順に配列に格納して返します。
ancestorsは「祖先」って意味だよ